#!/usr/bin/perl
#实验得到三个样本数据文件，
#分别保存为：GFP.trans.bowtie.sam.count.need、PsCRN115.trans.bowtie.sam.count.need、PsCRN161.trans.bowtie.sam.count.need，
#数据分为两列，第一列为基因表达量，第二列为基因名称。
#我们需要一个新的样本数据集，来体现不同样本在同一基因的表达量异同。
#得到文件sample_set.txt，包含四列数据，分别为基因名称、样本GFP表达量、样本PsCRN115表达量、样本PsCRN161表达量。
use warning;
use strict;
    my %hash;
	@gene_expression = qw/gene_names GFP PsCRN115 PsCRN161/;	#建立数组，添加第一行；
	push @sample_set,[@gene_expression];						#建立文件二维数组，储存每一个值；
	push @sample_set,"\n";
	#print "$sample_set[0][0]\n";
	#print "$sample_set[0][1]\n";
	#print "$sample_set[0][2]\n";
	#print "$sample_set[0][3]\n";
	#my @test;
	#push @test,$sample_set[$_][0];
	#push @test,$sample_set[$_][1];
	#push @test,$sample_set[$_][2];
	#push @test,$sample_set[$_][3];
	#open STDOUT,">>","sample_set0.txt" or die "can't create file sample_set0.txt!\n";
	#print "@test\n";
	#close STDOUT;
	
	$sample = 0;
	$last = 1;
	
	@files = <*.trans.bowtie.sam.count.need>;
	foreach $file(@files){
		my @data;
		open STDIN,"$file" or die "can't open file $file!\n";
		while (<STDIN>){
			@row = split(/\s+/);
			push @data,[@row];
		}
		close STDIN;
#		print $#row."\n";			#值为2；文件导致多出的第一列为空格列；不会影响后面生成整个样本表达量文件，所以懒得处理它了；
#		print $#data."\n";			#样本行数的数组；
		
		$count = 0;
		foreach (0..$#data){
			if (exists $hash{$data[$_][2]}){
				$value = $data[$_][2];
				$expression = $data[$_][1];
				($row) = grep{$sample_set[$_][0] eq $value} 0..$#sample_set;	#获取值的位置；
				$sample_set[$row][$sample+1] = $expression;
			}else{
				$hash{$data[$_][2]} = 1;
				$sample_set[$last+$count][0]=$data[$_][2];
				$sample_set[$last+$count][$sample+1]=$data[$_][1];
				$count += 1;
			}	
		}
		print "已完成一个文件！\n";
		$sample += 1;
		$last = $#sample_set+1;
#		print $#sample_set."\n";
#		print $last."\n";
	}
	
	foreach(0..$#sample_set){
		$heng = $_;
		foreach(0..3){
			$zong = $_;
			if (defined($sample_set[$heng][$zong])){
				next;
			}else{
				$sample_set[$heng][$zong] = 0;
			}
		}
		my @final;
		push @final,$sample_set[$_][0];
		push @final,$sample_set[$_][1];
		push @final,$sample_set[$_][2];
		push @final,$sample_set[$_][3];
		open STDOUT,">>","sample_set.txt" or die "can't create file sample_set.txt!\n";
		print "@final\n";
		close STDOUT;
	}	
